Infraestrutura na AWS com Terraform
Introdução
A implementação da arquitetura em nuvem utilizando o Terraform é um passo crucial para alcançar eficiência, escalabilidade e segurança no desenvolvimento e operação dos sistemas. O uso do Terraform para provisionar e gerenciar a infraestrutura na AWS (Amazon Web Services) assegura consistência e facilidade no manejo dos recursos. A integração de componentes-chave como um chatbot no WhatsApp, Interface Web Admin e o Turtlebot3, em um único sistema em nuvem, cria uma solução robusta e adaptável para atender às necessidades dinâmicas do projeto.
Benefícios
- Eficiência Operacional : Redução de tempo e esforço no gerenciamento de infraestrutura.
- Escalabilidade : Facilidade em escalar recursos conforme a demanda do sistema.
- Segurança Reforçada : Melhor controle e segurança na infraestrutura.
- Consistência : Redução de inconsistências e erros humanos.
- Flexibilidade : Capacidade de adaptação rápida a novas necessidades e tecnologias.
Serviços da AWS
- EC2 (Elastic Compute Cloud)
- Descrição : Hospeda os servidores back-end e front-end da aplicação.
- Benefícios : Oferece flexibilidade para escalar recursos e Elastic IP para endereços IP estáticos e confiáveis.
- Terraform : Scripts para provisionamento e gerenciamento de instâncias EC2.
- RDS (Relational Database Service)
- Descrição : Gerencia o banco de dados.
- Benefícios : Facilita operações como backup, recuperação e patching.
- Terraform : Automatização da configuração e manutenção do RDS.
- CloudWatch
- Descrição : Monitoramento de desempenho e logs.
- Benefícios : Permite análise em tempo real e troubleshooting.
- Terraform : Integração para configuração de alertas e monitoramento.
- VPC (Virtual Private Cloud)
- Descrição : Isolamento e proteção da infraestrutura na nuvem.
- Benefícios : Rede privada virtual segura na AWS.
- Terraform : Scripts para criação e gerenciamento da VPC.
- Elastic IP
- Descrição : Endereços IP estáticos para instâncias EC2.
- Benefícios : Facilita o gerenciamento de endereços IP e a comunicação com a internet.
- Terraform : Provisionamento e associação de Elastic IPs às instâncias.
- Security Group
- Descrição : Define regras de segurança para controlar o tráfego para instâncias.
- Benefícios : Garante segurança ao nível da rede.
- Terraform : Definição e aplicação de políticas de segurança.
Configurações Chave no Terraform
Estes arquivos se encontram na pasta infrastructure do nosso repositório.
provider.tf
e variables.tf
- Estrutura Fundamental: Estes arquivos estabelecem a base da nossa infraestrutura.
provider.tf
configura o acesso ao provedor AWS, essencial para todas as operações na nuvem.variables.tf
define variáveis cruciais como a região da AWS, detalhes de sub-redes e zonas de disponibilidade, oferecendo flexibilidade e possibilitando a personalização da infraestrutura.
ec2.tf
- Máquinas Virtuais para Aplicações: Define detalhadamente as instâncias EC2, incluindo tipos de instâncias, configurações de AMI e chaves de acesso. Essas instâncias, como a
chatbot_host
, são vitais para executar o chatbot e outras aplicações, garantindo desempenho e disponibilidade.
network.tf
- Configuração de Rede Abrangente: Detalha a criação de gateways de internet, endereços IP elásticos e gateways NAT, fundamentais para a conectividade e acessibilidade externa. Essas configurações são cruciais para o funcionamento ininterrupto das aplicações hospedadas.
security_group.tf
- Segurança Reforçada: Especifica grupos de segurança, estabelecendo regras detalhadas para o tráfego de entrada e saída. Isso é especialmente importante para proteger o banco de dados e outras instâncias, permitindo apenas tráfego autorizado e prevenindo acessos não desejados.
vpc.tf
- Isolamento e Gerenciamento de Rede: Explica a criação e configuração da VPC, incluindo detalhes sobre blocos CIDR, suporte a DNS e tags para identificação. A VPC serve como uma rede isolada dentro da AWS, crucial para segurança e organização eficiente dos recursos de rede.
elastic_ip.tf
- Estabilidade de Conexão com IPs Elásticos: Aloca endereços IP estáticos para instâncias críticas, garantindo que serviços essenciais, como o chatbot e a interface web, mantenham a conectividade constante, um aspecto vital para a confiabilidade do sistema.
elastic_container_registry.tf
- Gerenciamento Ágil de Contêineres: Cria e gerencia repositórios no AWS ECR, permitindo o armazenamento seguro e a gestão eficiente de imagens de contêineres. Essa configuração apoia a implantação rápida e flexível de aplicações, essencial para atualizações regulares e manutenção.
database.tf
- Armazenamento de Dados Centralizado e Seguro: Configura o ambiente de banco de dados na AWS, incluindo a definição de sub-redes e configurações de segurança. Detalha como o banco de dados é integrado ao sistema para armazenar informações do chatbot e outros dados essenciais.
Configurações de Chave da AWS
O terraform utiliza as credenciais da AWS para acessar e gerenciar os recursos na nuvem. Para garantir a segurança e proteção dos dados, as credenciais são armazenadas em um arquivo terraform.tfvars
que não é versionado no GitHub. O arquivo terraform.tfvars
é criado localmente e deve ser adicionado ao arquivo .gitignore
para evitar que as credenciais sejam expostas publicamente. O arquivo terraform.tfvars
deve ser criado no diretório infrastructure
e deve conter as seguintes informações:
AWS_REGION = "us-east-1"
AWS_ACCESS_KEY_ID = "minhaChaveDeAcesso"
AWS_SECRET_ACCESS_KEY = "minhaChaveSecreta"
AWS_SESSION_TOKEN = "meuTokenDeSessao"
As credenciais podem ser obtidas no console da AWS. Para mais informações, consulte a documentação da AWS. Após a criação do arquivo terraform.tfvars
, o Terraform pode ser inicializado e executado localmente ou no GitHub Actions passando as credenciais como variáveis de ambiente no arquivo variables.yml
colocando no valor dafault
.
Exemplo de Uso de Terraform
Uso Local
Instalação do Chocolatey
Abrir o PowerShell:
- Execute o PowerShell como administrador.
Executar o Script de Instalação:
- Copie e cole o seguinte comando:
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
- Copie e cole o seguinte comando:
Verificar Instalação:
- Após a conclusão, digite
choco
no PowerShell. Se a instalação estiver correta, você verá uma mensagem com a versão do Chocolatey.
- Após a conclusão, digite
Instalação do Terraform
Instalar Terraform via Chocolatey:
- No PowerShell (como administrador), execute:
choco install terraform
- No PowerShell (como administrador), execute:
Verificar Instalação:
- Para confirmar a instalação, digite
terraform -version
no PowerShell.
- Para confirmar a instalação, digite
Execução de Scripts Terraform
Navegar até o Diretório do Projeto:
- Use o comando
cd infrastructure
para navegar até o diretório onde os scripts do Terraform estão localizados.
- Use o comando
Inicializar Terraform:
- Execute
terraform init
para inicializar o Terraform no diretório.
- Execute
Criar Plano de Execução:
- Execute
terraform plan
para revisar as mudanças propostas.
- Execute
Aplicar Configurações:
- Para aplicar as configurações, execute
terraform apply
.
- Para aplicar as configurações, execute
Confirmar Aplicação:
- Quando solicitado, confirme a aplicação das configurações.
Uso do GitHub Actions
O grupo optou por utilizar o GitHub Actions para automatizar o processo de provisionamento e gerenciamento da infraestrutura na AWS. O GitHub Actions é um serviço de integração contínua (CI) e implantação contínua (CD) que permite a automação de tarefas de desenvolvimento de software. Dessa forma, podemos automatizar o processo de provisionamento e gerenciamento da infraestrutura na AWS, garantindo que as mudanças no código sejam refletidas na infraestrutura em nuvem. O GitHub Actions é integrado ao GitHub, o que facilita a configuração e execução de pipelines CI/CD.
O workflow "Terraform - Up Infrastructure" é projetado para ser executado no GitHub Actions. Ele automatiza a implementação de infraestrutura usando Terraform sempre que mudanças são feitas no diretório infrastructure
na branch main
do repositório.
Configuração do Workflow
Evento de Gatilho:
- Push: O workflow é ativado por eventos de
push
na branchmain
que incluam alterações na pastainfrastructure/**
.
- Push: O workflow é ativado por eventos de
Permissões:
- contents: read: O workflow tem permissão de leitura do conteúdo do repositório.
Jobs
Os jobs são executados em paralelo, o que permite que o workflow seja executado de forma mais rápida e eficiente.
Ambiente de Execução
- runs-on: Ubuntu-latest.
- environment: Production.
Steps
Checkout
- action:
actions/checkout@v2
. - descrição: Faz o checkout do código no runner.
- action:
Setup Terraform
- action:
hashicorp/setup-terraform@v1
. - with:
- cli_config_credentials_token: Utiliza um token armazenado em
secrets.TF_API_TOKEN
.
- cli_config_credentials_token: Utiliza um token armazenado em
- descrição: Configura o Terraform no ambiente do runner.
- action:
Terraform Init
- run:
cd infrastructure && terraform init
. - descrição: Inicializa o Terraform no diretório
infrastructure
.
- run:
Check for Changes in 'infrastructure' folder
- run: Script para verificar se houve mudanças na pasta
infrastructure
. - descrição: Determina se é necessário executar os comandos subsequentes do Terraform.
- run: Script para verificar se houve mudanças na pasta
Terraform Plan e Terraform Apply
- run:
cd infrastructure && terraform plan -input=false -out=tfplan && terraform apply -auto-approve -input=false tfplan
. - descrição: Executa
terraform plan
para criar um plano de execução eterraform apply
para aplicar as mudanças na infraestrutura.
- run:
Funcionamento
Quando ocorre um push
na branch main
com mudanças na pasta infrastructure
, o workflow é acionado. Ele executa uma série de passos, incluindo o setup do Terraform, inicialização, verificação de mudanças e, se necessário, a aplicação do plano Terraform para atualizar a infraestrutura na AWS.
Este fluxo de trabalho garante que as mudanças na infraestrutura sejam gerenciadas e aplicadas de maneira automatizada, eficiente e segura, seguindo as melhores práticas de IaC (Infraestrutura como Código) com o Terraform.
Teste de Pipeline CI/CD
A fim de testar o pipeline CI/CD, o grupo fez uma mudança no arquivo ec2.tf
para adicionar uma nova instância EC2. O pipeline CI/CD foi acionado e executou com sucesso, atualizando a infraestrutura na AWS.
Conclusão
A realização dessas mudanças na nossa infraestrutura em nuvem traz uma série de benefícios imediatos e de longo prazo. A eficiência operacional é aprimorada pela automatização do provisionamento e gestão de recursos, reduzindo o risco de erros humanos e acelerando o processo de desenvolvimento. A escalabilidade da infraestrutura assegura que possamos crescer e adaptar nossos serviços conforme a demanda, enquanto a robusta configuração de segurança protege nossos dados e aplicações. Adicionalmente, a integração do chatbot, da interface web e do Turtlebot3 em uma infraestrutura coesa e bem gerenciada otimiza o fluxo de trabalho e a experiência do usuário. Em resumo, essa implementação não apenas atende às necessidades atuais do nosso projeto, mas também estabelece uma base sólida para o crescimento e inovação futuros.